package org.example.service;


import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMailMessage;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.util.concurrent.Future;

@Service
public class MyAsyncService {


    public String test1() {
        return "test";
    }


    @Async //异步任务 一般用于耗时的工作 验证码的发送 不要影响主线程  无返回值异步任务
    public void SendSMS() {
        System.out.println("子线程调用短信验证码业务.......");
        long startTime = System.currentTimeMillis();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("子线程短信业务执行完成耗时：" + (endTime - startTime));
    }

    @Async  //有返回值的异步任务
//   Future表示一个可能还没有完成的异步任务的结果，
// 针对这个结果可以添加Callback以便在任务执行成功或失败后作出相应的操作。
    public Future<Integer> processA() throws Exception {
        System.out.println("开始分析并统计业务A数据...");
        Long startTime = System.currentTimeMillis();
        Thread.sleep(1000);
        int count = 123456;
        Long endTime = System.currentTimeMillis();
        System.out.println("业务A数据统计耗时：" + (endTime - startTime));
        return new AsyncResult<Integer>(count);
    }

    @Async

    public Future<Integer> processB() throws Exception {
        System.out.println("开始分析并统计业务B数据...");
        Long startTime = System.currentTimeMillis();
        Thread.sleep(5000);
        int count = 654321;
        Long endTime = System.currentTimeMillis();
        System.out.println("业务B数据统计耗时：" + (endTime - startTime));
        return new AsyncResult<Integer>(count);
    }

// fixedDelay  延迟执行。任务在上个任务完成后达到设置的延时时间就执行。
//    @Scheduled(fixedDelay = 2000)
//    public  void SchedulTask1()
//    {
//        System.out.println("SchedulTask");
//    }

    /**
     * 从左到右用空格隔开分别是：秒 分 时 日 月 周 年(可省略)
     * ：@scheduled (cron= " 0 0 0 0 * 2#3 " ) 表示：每月的第三个周一。
     *
     * @scheduled (cron = " 0 0 2 2 * ? * ") 表示：每月二号凌晨两点执行。
     * * ：通配，语义相当于每… 比如第五个位置的 * 就表示每月都会执行(相当于1-12)
     * ? ：忽略，语义相当于不管… 比如第六个位置的 ? 就表示不管当前是周几就会执行。至于为什么会有这种用法
     * 第一个位置：Seconds 秒：区间 0-59 秒，代表一分钟内的秒数。
     * 第二个位置：Minutes 分：区间 0-59 分，代表一小时内的分钟数。
     * 第三个位置：Hours 时：区间 0-23 时，代表一天中的小时数。
     * 第四个位置：Day of month 日：区间 1-31 (?根据每月有多少天来)，代表一月中的多少号。
     * 第五个位置：Month 月：区间 1-12 ，代表一年中的月份。
     * 第六个位置：Day of week 周：区间 1-7或者 英文星期的缩写 ，代表星期几。
     * （注意：1 对应周日 SUN , 7 对应周六 SAT ，如此循环）
     * 第七个位置：Year 年：区间1970-2099，代表具体年份，但是一般不用，可以直接不写。(为什么到了2099年就停了？)
     */
    //每天的11点43完成的任务  系统空闲时完成的耗资源任务
    @Scheduled(cron = "0 47 11 13 * ?")
    public void SchedulTask() {
        System.out.println("到点了 ！！！！！！");
    }

    @Autowired
    JavaMailSender sender;


    /**
     * 定时发送简单邮件的发送 纯文本文件
     */
    @Scheduled(cron = "0 20 12 * * ?")
    public void SendSimpleMailService() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom("502914391@qq.com");
        simpleMailMessage.setTo("502914391@qq.com");
        simpleMailMessage.setSubject("我的测试邮件");
        simpleMailMessage.setText("我的测试邮件我的测试邮件我的测试邮件我的测试邮件我的测试邮件我的测试邮件");
        simpleMailMessage.setCc("1901306206@qq.com");
        sender.send(simpleMailMessage);
    }

    /**
     * 发送带附件和图片的邮件
     */

    public void sendMimeMailService(String from,
                                    String to,
                                    String cc,
                                    String subject,
                                    String content,
                                    String jpgPath,
                                    String filePath) throws MessagingException {

        MimeMessage mimeMailMessage = sender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMailMessage, true);
        helper.addTo(to);
        helper.setCc(cc);
        File file = new File(filePath);
        helper.addAttachment(file.getName(), file);
        helper.setSubject(subject);
        helper.setText("<p>" + content + "</p><p>图片A：</p><img src='cid:p01'/>", true);
        helper.addInline("p01", new File(jpgPath));
        helper.setFrom(from);
        sender.send(mimeMailMessage);

    }

    @Autowired
    TemplateEngine templateEngine;
    public void sendMimeMailService2(String from,
                                    String to,
                                    String cc,
                                    String subject,
                                    String filePath) throws MessagingException {

        MimeMessage mimeMailMessage = sender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMailMessage, true);
        helper.addTo(to);
        helper.setCc(cc);
        File file = new File(filePath);
        helper.addAttachment(file.getName(), file);
        helper.setSubject(subject);
        helper.setFrom(from);
        Context context =new Context();
        context.setVariable("username","胡坤");
        context.setVariable("code",123456);
        String emailContext=templateEngine.process("1",context);
        helper.setText(emailContext,true);
        sender.send(mimeMailMessage);

    }




}
